package com.hxy.network.core.netty.client;


import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @description:  netty 客户端业务处理器 如果不加@ChannelHandler.Sharable注解，在重连服务端的时候绑定处理器就需要 new ClientHandler()，不能是单例
 * @program: component_code_integration
 * @author: HCY
 * @create: 2022/12/07 16:06
 */
@Component
@ChannelHandler.Sharable
@Slf4j
public class ClientHandler extends ChannelInboundHandlerAdapter {
    @Value("${netty.clientPort}")
    private int port ;

    @Value("${netty.clientIp}")
    private  String ip;
    @Resource
    private NettyClient nettyClient;
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
        log.info("netty客户端 成功连接服务");
    }

    /**
     * 服务器端读取到 客户端发送过来的数据，然后通过 Channel 回写数据
     * @param ctx
     * @param msg
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        System.out.println(String.format("netty客户端读取到从服务户端:%s 发送过来的数据：%s", ctx.channel().remoteAddress(), msg.toString()));
        // ctx.channel().writeAndFlush(String.format("server write:%s", msg));
    }

    /**
     * 捕获到异常的处理
     * @param ctx
     * @param cause
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }


    /**
     * 断开连接
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        log.error("####netty客户端断开连接####");
        // 重新连接服务 如果有手动断开的功能，就不能写在这里 会重复连接
        nettyClient.startClient(ip,port);
    }
}
